package com.liuyucheng.concurrent.waitnotify;

public class Message {
    private String content;
    private boolean available = false;

    // 生产者调用的方法：发送消息
    public synchronized void send(String content) {
        // 当消息未被消费时，生产者等待
        while (available) {
            try {
                wait(); // 释放锁并等待
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        // 生产消息
        this.content = content;
        this.available = true;
        System.out.println("生产者发送: " + content);

        // 通知消费者
        notify(); // 唤醒可能正在等待的消费者线程
    }

    // 消费者调用的方法：接收消息
    public synchronized String receive() {
        // 当消息不可用时，消费者等待
        while (!available) {
            try {
                wait(); // 释放锁并等待
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        // 消费消息
        this.available = false;
        System.out.println("消费者接收: " + content);

        // 通知生产者
        notify(); // 唤醒可能正在等待的生产者线程
        return content;
    }
}
